freeslot(
	"SPR2_DIE_",
	"SPR2_FDIE",
	"S_PLAY_DIE",
	"S_PLAY_FDIE"
)

spr2defaults[SPR2_DIE_] = SPR2_DEAD
spr2defaults[SPR2_FDIE] = SPR2_PAIN

states[S_PLAY_DIE] = {
	sprite = SPR_PLAY,
	frame = SPR2_DIE_|FF_ANIMATE,
	tics = 12,
	var1 = 5,
	var2 = 2,
	nextstate = S_PLAY_FDIE
}

states[S_PLAY_FDIE] = {
	sprite = SPR_PLAY,
	frame = SPR2_FDIE,
	tics = -1,
	nextstate = S_PLAY_FDIE
}

addHook("PlayerThink", function(p) //fucking dumb bullshit...
	if p.playerstate == PST_DEAD then
		p.realmo.state = S_INVISIBLE
		p.realmo.flags = $|MF_NOGRAVITY
		p.realmo.momz = 0
		if p.mo.currentcorpse and not p.mo.currentcorpse.valid then //if we're pointing to a non-existant corpse
			p.mo.currentcorpse = nil //get rid of our pointer
		end
		if p.mo.currentcorpse then
			P_MoveOrigin(p.realmo, p.mo.currentcorpse.x, p.mo.currentcorpse.y, p.mo.currentcorpse.z)
			if p == displayplayer then
				//P_TeleportCameraMove(camera, p.mo.currentcorpse.x-(48*cos(p.mo.currentcorpse.holdangle))+p.mo.currentcorpse.momx, p.mo.currentcorpse.y-(48*cos(p.mo.currentcorpse.holdangle))+p.mo.currentcorpse.momy, p.mo.currentcorpse.z+(48*FU))//*P_MobjFlip(p.mo.currentcorpse)
				//camera.aiming = -ANGLE_45
			end
		end
	end
end)

addHook("MobjDeath", function(mo, _, _, dt)
	if not mo.type == MT_PLAYER then return end
	mo.flags = $|MF_NOGRAVITY
	local corpse = P_SpawnGhostMobj(mo)
	mo.currentcorpse = corpse
	mo.state = S_INVISIBLE
	mo.flags = $|MF_NOGRAVITY
	corpse.fuse = UINT32_MAX
	corpse.momx = mo.momx
	corpse.momy = mo.momy
	corpse.momz = mo.momz
	corpse.holdangle = mo.angle
	mo.momz = 0
	corpse.iscorpse = true
	corpse.friction = 29*FRACUNIT/32
	corpse.flags = mo.flags & ~(MF_SOLID|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SHOOTABLE)
	corpse.color = mo.color
	corpse.state = S_PLAY_DIE
	corpse.shadowscale = mo.shadowscale
end, MT_PLAYER)

addHook("MobjThinker", function(mo)
	if not (mo and mo.valid) then return end
	if not mo.iscorpse then return end
	if not P_CheckDeathPitCollide(mo) then return end
	mo.state = S_NULL
end, MT_GHOST)